#include "tasks.h"
#include <stdlib.h>

using namespace std;

void TaskCPU(vector<int> params) { // params: n
	uso_CPU(params[0]); // Uso el CPU n milisegundos.
}

void TaskIO(vector<int> params) { // params: ms_cpu, ms_io,
	uso_CPU(params[0]); // Uso el CPU ms_cpu milisegundos.
	uso_IO(params[1]); // Uso IO ms_io milisegundos.
}

void TaskAlterno(vector<int> params) { // params: ms_cpu, ms_io, ms_cpu, ...
	for(int i = 0; i < (int)params.size(); i++) {
		if (i % 2 == 0) uso_CPU(params[i]);
		else uso_IO(params[i]);
	}
}

void TaskConsola(vector<int> params){
	int bmin = params[1];
	int bmax = params[2];
	int n = params[0];
	srand(time(NULL));
	for(int i = 0; i < n; i++){	
		int t = (rand() % (bmax-bmin)) + bmin;  
		uso_IO(t);
	}	
}

void TaskBatch(vector<int> params){
	unsigned int total_cpu = params[0];
	unsigned int cant_bloqueos = params[1];
	int a2 = 0;
	srand(time(NULL)); 
	int a1 = (rand() % ((total_cpu - cant_bloqueos) - a2)) + a2 ;
	for(unsigned int i = 0; i<cant_bloqueos; i++){
		if(a1-a2 < 0) break;
		else {
			uso_CPU(a1-a2);
			a2 = a1; 
			a1 = (rand() % ((total_cpu - cant_bloqueos) - a2)) + a2 ;
			uso_IO(1);
		}
	}

	uso_CPU(total_cpu - a2);	

	//a1
	//uso_CPU(a1)
	
	//uso_IO(1)
	
	//a2
	//uso_CPU(a2-a1)
	//uso_IO(1)
	
	
	//uso_CPU(total_cpu);
	
	//for(unsigned int i=0; i<cant_bloqueos; i++)
	//	uso_IO(1);
}

void tasks_init(void) {
	/* Todos los tipos de tareas se deben registrar acá para poder ser usadas.
	 * El segundo parámetro indica la cantidad de parámetros que recibe la tarea
	 * como un vector de enteros, o -1 para una cantidad de parámetros variable. */
	register_task(TaskCPU, 1);
	register_task(TaskIO, 2);
	register_task(TaskAlterno, -1);
	register_task(TaskConsola, 3);
	register_task(TaskBatch, 2);
}
